package com.xueqiu.movieplaymanagersystem.service;

import com.xueqiu.movieplaymanagersystem.entity.Blog;
import com.github.pagehelper.PageInfo;

import java.util.List;

/**
 * @author xueqiu
 */
public interface BlogService {
    /**
     * 发布新闻
     *
     * @param originData 数据源
     * @return 是否发布
     */
    boolean publish(Blog originData);

    /**
     * 保存新闻
     *
     * @param originData 数据源
     * @return 是否保存
     */
    boolean save(Blog originData);

    /**
     * 更新访问量根据新闻id
     *
     * @param id 新闻id
     * @return 更新条数
     */
    boolean editViewsById(String id);

    /**
     * 更新点赞量根据新闻id
     *
     * @param id 新闻id
     * @return 更新条数
     */
    boolean editLikesById(String id);

    /**
     * 根据id删除单条数据
     *
     * @param id 标签id
     * @return 删除条数
     */
    boolean removeById(String id);

    /**
     * 批量删除根据复数新闻id
     *
     * @param idList 复数新闻id
     * @return 删除条数
     */
    int removeByIdBatch(List<String> idList);

    /**
     * 根据id查询
     *
     * @param id 新闻id
     * @return 单个查询结果；可能为空
     */
    Blog findById(String id);

    /**
     * 查询单个新闻全部信息，根据新闻id
     *
     * @param id 新闻id
     * @return 单个新闻全部信息
     */
    Blog findDetailById(String id);

    /**
     * 分页查询若干新闻，通过关键字；
     * 关键字出现在标题或者正文
     *
     * @param keyWord 关键字
     * @param page    当前页
     * @param limit   当前页数据条数
     * @return 结果列表
     */
    PageInfo<Blog> findByKeyWord(String keyWord, int page, int limit);

    /**
     * 分页查询已发布的新闻
     *
     * @param page  指定当前页
     * @param limit 指定每页展示数量
     * @return 新闻列表
     */
    PageInfo<Blog> findAllPublished(int page, int limit);

    /**
     * 查询新闻，根据标题关键字和类型id和是否推荐状态
     * 如果标题关键字和类别id都为null，那么不进行title字段和type_id字段的条件限制
     *
     * @param keyWord   标题关键字
     * @param typeId    类型id
     * @param isCommend 是否推荐状态
     * @param page      当前页
     * @param limit     每页显示数量
     * @return 新闻列表，可能为空
     */
    PageInfo<Blog> findByKeyWordAndTypeIdAndCommend(String keyWord, String typeId, boolean isCommend, int page, int limit);

    /**
     * 分页查询若干新闻根据类别id
     *
     * @param typeId 类别id
     * @param page   当前页
     * @param limit  当前页展示条数
     * @return 新闻列表
     */
    PageInfo<Blog> findByTypeId(String typeId, int page, int limit);

    /**
     * 查询若干新闻，根据标签id下指定范围的新闻id
     *
     * @param tagId 标签id
     * @param page  当前页
     * @param limit 当前页展示条数
     * @return 新闻列表
     */
    PageInfo<Blog> findByTagId(String tagId, int page, int limit);

    /**
     * 查询所有推荐的新闻
     *
     * @return 推荐的新闻列表
     */
    List<Blog> findByCommend();

    /**
     * 查询访问量最多的1个新闻
     * 使用排序和分页实现
     *
     * @return 访问量最多的1个新闻
     */
    Blog findTopOneViews();

    /**
     * 查询点赞量优先的最多点赞数的前6名新闻
     * 访问量优先级低于点赞量
     * 使用排序和分页实现
     *
     * @return 前6名新闻
     */
    List<Blog> findTopSixLikes();

    /**
     * 查询被推荐的访问量前4名的新闻
     * 使用排序和分页实现
     *
     * @return 前4名新闻
     */
    List<Blog> findTopFourViewsWithCommend();

    /**
     * 查询“被排除的新闻”的类别下的所有新闻列表，但是剔除“被排除的新闻”
     * 如果不存在列表
     * 那就查询“被排除的新闻”的标签组下的所有新闻列表，但是剔除“被排除的新闻”
     * <p>
     * 如果二者同时存在，则进行元素合并；重点在元素合并
     *
     * @param typeId          类别id
     * @param eliminateBlogId 被排除的新闻id
     * @param tagIdsArray     标签组，元素是标签id
     * @return 除了该新闻id代表的，以外的所有新闻
     */
    List<Blog> findEliminateBlogByTypeIdAndTagId(String typeId, String eliminateBlogId, String[] tagIdsArray);

    /**
     * 查询该新闻的在数据库中的前一个新闻
     * 通过比较id实现和分页
     *
     * @param id 该新闻id
     * @return 前一个新闻
     */
    Blog findBeforeById(String id);

    /**
     * 查询该新闻的在数据库中的后一个新闻
     * 通过比较id实现和分页
     *
     * @param id 该新闻id
     * @return 后一个新闻
     */
    Blog findAfterById(String id);

    /**
     * 随机获取若干数量新闻
     * SQL语句时查询全部新闻
     * 通过Collections.shuffle()方法达到随机目的。
     * 查询的字段是id, title, author, flag, views, `like`
     *
     * @param id 当前新闻id
     * @return 随机的6个元素的新闻列表；按照访问量从小到大排序
     */
    List<Blog> findRandomNumsById(String id);

    /**
     * 查询新闻正文内容根据新闻id
     *
     * @param id 新闻id
     * @return 新闻正文内容
     */
    Blog findContentById(String id);

    /**
     * 查询创建日期和标题
     * 按照从新到旧的顺序排序
     *
     * @return 创建日期和标题
     */
    List<Blog> findAllOfTimeAndTitle();

    /**
     * 查询所有新闻数量，包含保存的新闻和发布的新闻
     *
     * @return 所有新闻数量
     */
    Integer findCount();

    /**
     * 查询所有保存的新闻数量
     *
     * @return 所有保存的新闻数量
     */
    Integer findSaveCount();

    /**
     * 查询所有已发布的新闻的数量
     *
     * @return 所有已发布的新闻的数量
     */
    Integer findPublishCount();
}
